package doubleLinkedNode;

public class DoubleLinkedNodeImpl extends DoubleLinkedNode {

    private DoubleLinkedNodeImpl temp = this;
    private DoubleLinkedNodeImpl firstNode;
    private DoubleLinkedNodeImpl lastNode;


    public DoubleLinkedNodeImpl(int id,String name) {
        super(id,name);
    }

    /**
     * 将temp指向链表的第一个节点
     */
    public void findFirstNode(){
        temp=this;
        while (true){
            if (temp.getPreNode()==null){
                break;
            }
            temp=temp.getPreNode();
        }
        firstNode=temp;
    }

    /**
     * 将temp指向链表的最后一个节点
     */
    public void findLastNode(){
        temp=this;
        while (true){
            if(temp.getNextNode()==null){
                break;
            }
            temp=temp.getNextNode();
        }
        lastNode=temp;
    }

    /**
     *控制台打印链表的全部内容
     */
    @Override
    public void printAll(){
        findFirstNode();
        while(true){
            if (temp==null){
                break;
            }
            System.out.println(temp.getId()+"——"+temp.getName());
            temp= temp.getNextNode();
        }
    }

    /**
     * 在链表的末尾新增节点
     * @author MMCC
     * @param newNode
     */
    @Override
    public void addNode(DoubleLinkedNodeImpl newNode){

        findLastNode();
        temp.setNextNode(newNode);
        newNode.setPreNode(temp);

    }

    /**
     * 按照Id的从小到大进行节点新增
     * @author MMCC
     * @param newNode
     */
    @Override
    public void addInOrder(DoubleLinkedNodeImpl newNode){
        boolean flag=false;
        findFirstNode();

        while(true){

            if(temp.getId()>newNode.getId()){
                flag=true;
                break;
            }

            if(temp.getId()==newNode.getId()){
                System.out.println("该id节点已经存在");
                return;
            }
            if(temp.getNextNode()==null){
                break;
            }

            temp=temp.getNextNode();
        }

        if(flag){

            if(temp==firstNode){
                newNode.setNextNode(temp);
                temp.setPreNode(newNode);
            }else {
                newNode.setPreNode(temp.getPreNode());
                newNode.setNextNode(temp);
                newNode.getPreNode().setNextNode(newNode);
                temp.setPreNode(newNode);
            }

        }else {
            temp.setNextNode(newNode);
            newNode.setPreNode(temp);
        }
    }

    /**
     * 获取链表的长度
     * @return
     */
    @Override
    public int getLength() {
        int length=0;
        temp=this;
        while (true){
            if (temp.getPreNode()==null){
                break;
            }
            temp=temp.getPreNode();
            length++;
        }

        temp=this;
        while (true){
            if (temp.getNextNode()==null){
                break;
            }
            temp=temp.getNextNode();
            length++;
        }

        return length+1;
    }

    /**
     * 通过id进行删除
     * @param id
     */
    public void deleteNode(int id){
        boolean flag=false;
        temp=this;
        while (true){
            if (temp.getPreNode().getId()==id){
                flag=true;
                break;
            }
            temp=temp.getPreNode();

        }
        if (!flag){
            temp=this;
            while (true){
                if (temp.getNextNode().getId()==id){
                    flag=true;
                    break;
                }
                temp=temp.getNextNode();
            }
        }

        if(flag){
            if(!(temp.getPreNode()==null)) temp.getPreNode().setNextNode(temp.getNextNode());
            if(!(temp.getNextNode()==null)) temp.getNextNode().setPreNode(temp.getPreNode());
            if((temp.getPreNode()==null)&&(temp.getNextNode()==null)) temp=null;
        }else {
            System.out.println("不存在该节点");
        }

    }
}
